home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
vol_300
/
335_02
/
as6809.y
< prev
next >
Wrap
Text File
|
1990-12-02
|
51KB
|
2,204 lines
%{
/*
HEADER: ;
TITLE: Frankenstein Cross Assemblers;
VERSION: 2.0;
DESCRIPTION: " Reconfigurable Cross-assembler producing Intel (TM)
Hex format object records. ";
KEYWORDS: cross-assemblers, 1805, 2650, 6301, 6502, 6805, 6809,
6811, tms7000, 8048, 8051, 8096, z8, z80;
SYSTEM: UNIX, MS-Dos ;
FILENAME: as6809.y;
WARNINGS: "This software is in the public domain.
Any prior copyright claims are relinquished.
This software is distributed with no warranty whatever.
The author takes no responsibility for the consequences
of its use.
Yacc (or Bison) required to compile." ;
SEE-ALSO: as6809.doc,frasmain.c;
AUTHORS: Mark Zenier;
COMPILERS: Microport Sys V/AT, ATT Yacc, Turbo C V1.5, Bison (CUG disk 285)
(previous versions Xenix, Unisoft 68000 Version 7, Sun 3);
*/
/* 6809 instruction generation file */
/* November 17, 1990 */
/*
description frame work parser description for framework cross
assemblers
history February 2, 1988
September 11, 1990 - merge table definition
September 12, 1990 - short file names
September 14, 1990 - short variable names
September 17, 1990 - use yylex as external
*/
#include <stdio.h>
#include "frasmdat.h"
#include "fragcon.h"
#define yylex lexintercept
/* select criteria for ST_EXP 0000.0000.0000.00xx */
#define ADDR 0x3
#define DIRECT 0x1
#define EXTENDED 0x2
#define ST_INH 0x1
#define ST_IMM 0x2
#define ST_EXP 0x4
#define ST_IND 0x8
#define ST_PCR 0x10
#define ST_IPCR 0x20
#define ST_IEXPR 0x40
#define ST_SPSH 0x1
#define ST_UPSH 0x1
#define ST_TFR 0x1
static char genbdef[] = "[1=];";
static char genwdef[] = "[1=]x"; /* x for normal, y for byte rev */
char ignosyn[] = "[Xinvalid syntax for instruction";
char ignosel[] = "[Xinvalid operands";
#define IDM000 0
#define IDM100 1
#define IDM101 2
#define IDM102 3
#define IDM103 4
#define IDM104 5
#define IDM105 6
#define IDM106 7
#define IDM108 8
#define IDM109 9
#define IDM10B 10
#define IDM111 11
#define IDM113 12
#define IDM114 13
#define IDM115 14
#define IDM116 15
#define IDM118 16
#define IDM119 17
#define IDM11B 18
char *(indexgen [] [4]) = {
/*IDM000;*/ { "[1=].5R.00|;", "[1=].5R.20|;", "[1=].5R.40|;", "[1=].5R.60|;"},
/*IDM100;*/ { "80;", "a0;", "c0;", "e0;" },
/*IDM101;*/ { "81;", "a1;", "c1;", "e1;" },
/*IDM102;*/ { "82;", "a2;", "c2;", "e2;" },
/*IDM103;*/ { "83;", "a3;", "c3;", "e3;" },
/*IDM104;*/ { "84;", "a4;", "c4;", "e4;" },
/*IDM105;*/ { "85;", "a5;", "c5;", "e5;" },
/*IDM106;*/ { "86;", "a6;", "c6;", "e6;" },
/*IDM108;*/ { "88;[1=]r", "a8;[1=]r", "c8;[1=]r", "e8;[1=]r" },
/*IDM109;*/ { "89;[1=]x", "a9;[1=]x", "c9;[1=]x", "e9;[1=]x" },
/*IDM10B;*/ { "8B;", "aB;", "cB;", "eB;" },
/*IDM111;*/ { "91;", "B1;", "D1;", "F1;" },
/*IDM113;*/ { "93;", "B3;", "D3;", "F3;" },
/*IDM114;*/ { "94;", "B4;", "D4;", "F4;" },
/*IDM115;*/ { "95;", "B5;", "D5;", "F5;" },
/*IDM116;*/ { "96;", "B6;", "D6;", "F6;" },
/*IDM118;*/ { "98;[1=]r", "b8;[1=]r", "d8;[1=]r", "f8;[1=]r" },
/*IDM119;*/ { "99;[1=]x", "b9;[1=]x", "d9;[1=]x", "f9;[1=]x" },
/*IDM11B;*/ { "9B;", "BB;", "DB;", "FB;" }
};
#define PCRNEG8M -126
#define PCRPLUS8M 129
#define PCR8STR "8c;[1=].Q.1+-r"
#define IPCR8STR "9c;[1=].Q.1+-r"
#define PCR16STR "8d;[1=].Q.2+-.ffff&x"
#define IPCR16STR "9d;[1=].Q.2+-.ffff&x"
#define IEXPSTR "9f;[1=]x"
#define TFRD 0
#define TFRX 1
#define TFRY 2
#define TFRU 3
#define TFRS 4
#define TFRPC 5
#define TFRA 0x8
#define TFRB 0x9
#define TFRCC 0xa
#define TFRDP 0xb
#define TFR8BIT 0x8
#define REGBUSTK 0x100
#define REGBSSTK 0x200
#define PPOSTCC 0x01
#define PPOSTA 0x02
#define PPOSTB 0x04
#define PPOSTDP 0x08
#define PPOSTX 0x10
#define PPOSTY 0x20
#define PPOSTS (0x40|REGBSSTK)
#define PPOSTU (0x40|REGBUSTK)
#define PPOSTPC 0x80
long labelloc;
static int satsub;
int ifstkpt = 0;
int fraifskip = FALSE;
struct symel * endsymbol = SYMNULL;
%}
%union {
int intv;
long longv;
char *strng;
struct symel *symb;
}
%token <intv> ACCUM
%token <intv> INDEX
%token <intv> SPECREG
%token PCRELATIVE
%type <intv> regbits register
%type <strng> indexed
%token <intv> KOC_BDEF
%token <intv> KOC_ELSE
%token <intv> KOC_END
%token <intv> KOC_ENDI
%token <intv> KOC_EQU
%token <intv> KOC_IF
%token <intv> KOC_INCLUDE
%token <intv> KOC_ORG
%token <intv> KOC_RESM
%token <intv> KOC_SDEF
%token <intv> KOC_SET
%token <intv> KOC_WDEF
%token <intv> KOC_CHSET
%token <intv> KOC_CHDEF
%token <intv> KOC_CHUSE
%token <intv> KOC_opcode
%token <intv> KOC_sstkop
%token <intv> KOC_ustkop
%token <intv> KOC_tfrop
%token <longv> CONSTANT
%token EOL
%token KEOP_AND
%token KEOP_DEFINED
%token KEOP_EQ
%token KEOP_GE
%token KEOP_GT
%token KEOP_HIGH
%token KEOP_LE
%token KEOP_LOW
%token KEOP_LT
%token KEOP_MOD
%token KEOP_MUN
%token KEOP_NE
%token KEOP_NOT
%token KEOP_OR
%token KEOP_SHL
%token KEOP_SHR
%token KEOP_XOR
%token KEOP_locctr
%token <symb> LABEL
%token <strng> STRING
%token <symb> SYMBOL
%token KTK_invalid
%right KEOP_HIGH KEOP_LOW
%left KEOP_OR KEOP_XOR
%left KEOP_AND
%right KEOP_NOT
%nonassoc KEOP_GT KEOP_GE KEOP_LE KEOP_LT KEOP_NE KEOP_EQ
%left '+' '-'
%left '*' '/' KEOP_MOD KEOP_SHL KEOP_SHR
%right KEOP_MUN
%type <intv> expr exprlist stringlist
%start file
%%
file : file allline
| allline
;
allline : line EOL
{
clrexpr();
}
| EOL
| error EOL
{
clrexpr();
yyerrok;
}
;
line : LABEL KOC_END
{
endsymbol = $1;
nextreadact = Nra_end;
}
| KOC_END
{
nextreadact = Nra_end;
}
| KOC_INCLUDE STRING
{
if(nextfstk >= FILESTKDPTH)
{
fraerror("include file nesting limit exceeded");
}
else
{
infilestk[nextfstk].fnm = savestring($2,strlen($2));
if( (infilestk[nextfstk].fpt = fopen($2,"r"))
==(FILE *)NULL )
{
fraerror("cannot open include file");
}
else
{
nextreadact = Nra_new;
}
}
}
| LABEL KOC_EQU expr
{
if($1 -> seg == SSG_UNDEF)
{
pevalexpr(0, $3);
if(evalr[0].seg == SSG_ABS)
{
$1 -> seg = SSG_EQU;
$1 -> value = evalr[0].value;
prtequvalue("C: 0x%lx\n",
evalr[0].value);
}
else
{
fraerror(
"noncomputable expression for EQU");
}
}
else
{
fraerror(
"cannot change symbol value with EQU");
}
}
| LABEL KOC_SET expr
{
if($1 -> seg == SSG_UNDEF
|| $1 -> seg == SSG_SET)
{
pevalexpr(0, $3);
if(evalr[0].seg == SSG_ABS)
{
$1 -> seg = SSG_SET;
$1 -> value = evalr[0].value;
prtequvalue("C: 0x%lx\n",
evalr[0].value);
}
else
{
fraerror(
"noncomputable expression for SET");
}
}
else
{
fraerror(
"cannot change symbol value with SET");
}
}
| KOC_IF expr
{
if((++ifstkpt) < IFSTKDEPTH)
{
pevalexpr(0, $2);
if(evalr[0].seg == SSG_ABS)
{
if(evalr[0].value != 0)
{
elseifstk[ifstkpt] = If_Skip;
endifstk[ifstkpt] = If_Active;
}
else
{
fraifskip = TRUE;
elseifstk[ifstkpt] = If_Active;
endifstk[ifstkpt] = If_Active;
}
}
else
{
fraifskip = TRUE;
elseifstk[ifstkpt] = If_Active;
endifstk[ifstkpt] = If_Active;
}
}
else
{
fraerror("IF stack overflow");
}
}
| KOC_IF
{
if(fraifskip)
{
if((++ifstkpt) < IFSTKDEPTH)
{
elseifstk[ifstkpt] = If_Skip;
endifstk[ifstkpt] = If_Skip;
}
else
{
fraerror("IF stack overflow");
}
}
else
{
yyerror("syntax error");
YYERROR;
}
}
| KOC_ELSE
{
switch(elseifstk[ifstkpt])
{
case If_Active:
fraifskip = FALSE;
break;
case If_Skip:
fraifskip = TRUE;
break;
case If_Err:
fraerror("ELSE with no matching if");
break;
}
}
| KOC_ENDI
{
switch(endifstk[ifstkpt])
{